#include "account.h"

void get_salt(char *salt,char *passWd) {
    int i, j;
    //取出 salt,i 记录密码字符下标,j 记录$出现次数
    for(i = 0, j = 0; passWd[i] && j != 3; ++i) {
        if(passWd[i] == '$') {
            ++j;
        }
    }
    strncpy(salt, passWd, i-1);
}

// 密码验证功能
int PwdCheck(char *userName){
    // 参数是输入的用户名
    // 用于接收密码及相关内容的数据结构
    struct spwd *sp;
    char *passWd;
    char salt[512] = {0};

    // 检查用户输入的 userName 是否为空
    if(userName[0] == '\0'){
        printf("Username ERROR!\n");
        exit(-1);
    }

    // 通过 getpass 函数获取用户输入的密码
    passWd = getpass("Please input your code: ");
    // 通过 getspnam 函数从 /etc/shadow 文件夹获得此用户的密码
    sp = getspnam(userName);

    // 检查Linux 中储存的密码是否为空
    if(sp == NULL){
        perror("No such user!");
        exit(-2);
    }

    // 获取 salt
    get_salt(salt, sp->sp_pwdp);


    // 验证密码是否正确
    if(strcmp(sp->sp_pwdp, crypt(passWd, salt)) == 0){  
        printf("Passwd Correct!\n");
    }
    else{
        printf("Passwd ERROR!\n");
    }

    return 0;
}


